/*
 *所有关于cw_djlc_djzb类的业务代码应在此处编写
*可使用repository.调用常用方法，获取EF/Dapper等信息
*如果需要事务请使用repository.DbContextBeginTransaction
*也可使用DBServerProvider.手动获取数据库相关信息
*用户信息、权限、角色等使用UserContext.Current操作
*cw_djlc_djzbService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
using System.Linq;
using VOL.Core.Utilities;
using System.Linq.Expressions;
using VOL.Core.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using VOL.Finance.IRepositories;
using VOL.Core.Float;
using VOL.Core.ManageUser;
using VOL.Core.DBManager;
using System.Collections.Generic;
using System;
using Castle.Core.Internal;
using System.Net;
using System.Globalization;
using VOL.Finance.Repositories;
using Microsoft.EntityFrameworkCore.Storage;

namespace VOL.Finance.Services
{
    public partial class cw_djlc_djzbService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly Icw_djlc_djzbRepository _repository;//访问数据库

        [ActivatorUtilitiesConstructor]
        public cw_djlc_djzbService(
            Icw_djlc_djzbRepository dbRepository,
            IHttpContextAccessor httpContextAccessor
            )
        : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            //多租户会用到这init代码，其他情况可以不用
            //base.Init(dbRepository);
        }
        public override WebResponseContent Add(SaveModel saveDataModel)
        {
            cw_djlc_bomnumber_view cw_djlc_bomnumber_view = DjlcGetMaxCode.GetMaxCode();
            WebResponseContent webResponseIsSuccess = new WebResponseContent();
            WebResponseContent webResponseNewboomnumber = new WebResponseContent();
            AddOnExecuting = (cw_djlc_djzb cw_djlc_djzb, object list) =>
            {
                /// 新创建的流程中的对标物料号不能是正在进行中流程总的需求物料号
                cw_djlc_djzb cw_djlc_djzb1 =  DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.newmaterialnum == cw_djlc_djzb.oldmaterialnum && x.stepid != 99 && x.is_enable == 1 && x.is_delete == 0).FirstOrDefault();
                if (!cw_djlc_djzb1.IsNullOrEmpty())
                {
                    return webResponseIsSuccess.Error("对标物料号还未定价，请确认后，重新提交流程");
                }

                // 相同整车物料号在同一年内不能作为需求物料发起多笔。只能发起一笔。废弃流程除外
                List<cw_djlc_djzb> cw_djlc_djzbList = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.newmaterialnum == cw_djlc_djzb.newmaterialnum && x.is_enable != 0 && x.is_delete != 1 && DateTime.Now.Year == x.CreateDate.Value.Year).ToList();
                if (cw_djlc_djzbList.Count() > 0)
                {
                    return webResponseIsSuccess.Error("同一整车物料号在同一年内不能作为需求物料发起多笔，请确认后，重新提交流程");
                }

                /// 新创建的流程中的对标物料是已经核价的需求物料时，需要将该物料号的差异分析、差异分析汇总标识置为0，以便差异分析及差异分析汇总定时任务获取数据
                cw_djlc_djzb cw_djlc_djzb2 = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.newmaterialnum == cw_djlc_djzb.oldmaterialnum && x.stepid == 99 && x.is_delete == 0).FirstOrDefault();
                if (!cw_djlc_djzb2.IsNullOrEmpty())
                {
                    var sql1 = "update cw_djlc_wlzb set is_synchronization_status = 0 where bomnumber = @bomnumber";
                    var bomnumber = cw_djlc_djzb2.newbomnumber;
                    DBServerProvider.SqlDapper.ExcuteNonQuery(sql1, new { bomnumber });
                    DBServerProvider.DbContext.SaveChanges();
                }
                
                /// 根据创建时的对标物料号去BOM表中查询，如果能查询到对应的数据，哪怕就只有一条我也认为有BOM
                cw_djlc_wlzb cw_djlc_wlzb =  DBServerProvider.DbContext.Set<cw_djlc_wlzb>().Where(x => x.materialnum == cw_djlc_djzb.oldmaterialnum && x.is_delete == 0).FirstOrDefault();
                if (!cw_djlc_wlzb.IsNullOrEmpty()) 
                {
                    cw_djlc_djzb.is_have_bom = 1;
                    cw_djlc_djzb.oldbomnumber = cw_djlc_wlzb.bomnumber;
                }

                /// 新创建的流程中的对标物料是上一条流程中的对标物料时，则需要将对标物料的同步标识改为0，对标物料都是已定价的物料。价格不会进行更改
                if (!cw_djlc_djzb.oldbomnumber.IsNullOrEmpty())
                {
                    var sql1 = "update cw_djlc_wlzb set is_synchronization_status = 0 where bomnumber = @bomnumber";
                    var bomnumber = cw_djlc_djzb.oldbomnumber;
                    DBServerProvider.SqlDapper.ExcuteNonQuery(sql1, new { bomnumber });
                    DBServerProvider.DbContext.SaveChanges();
                }
                string salechannel = cw_djlc_djzb.salechannel;
                cw_djlc_qddjgz qddjgz = DBServerProvider.DbContext.Set<cw_djlc_qddjgz>().Where(x => x.channelname == salechannel && x.status == 0).ToList().FirstOrDefault();
                cw_djlc_djzb.cw_djlc_qddjgz_id = qddjgz !=null ?qddjgz.cw_djlc_qddjgz_id : Guid.Empty;
                cw_djlc_djzb.newbomnumber = cw_djlc_bomnumber_view.bomnumber;
                cw_djlc_djzb.cw_djlc_code = cw_djlc_bomnumber_view.cw_djlc_code;
                cw_djlc_djzb.is_synchronization_status = 0;
                cw_djlc_djzb.is_enable = 1;
                cw_djlc_djzb.is_delete = 0;
                return webResponseNewboomnumber.OK();
            };

            //dynamic_option mainEntity = saveDataModel.MainData.DicToEntity<dynamic_option>();

            WebResponseContent webResponse = new WebResponseContent();
            AddOnExecuted = (cw_djlc_djzb currList, object list) =>
            {
                FloatManager.AddProcese(currList);//启动一个新审批流程
                return webResponse.OK();
            };
            return base.Add(saveDataModel);
        }
        public override PageGridData<cw_djlc_djzb> GetPageData(PageDataOptions options)
        {
            QueryRelativeExpression = (IQueryable<cw_djlc_djzb> queryable) =>
            {
                //1、自己创建或者超级管理都能全程看到
                //2、有没有处理过的task任务

                var user = UserContext.Current.GetUserInfo(UserContext.Current.UserId);

                var doctask = DBServerProvider.DbContext.Set<fk_reimtask>();
                queryable = queryable.Where(x => //user.Role_Id == 1 || user.Role_Id == 2 || 
                                              (x.is_enable == 1 && x.is_delete == 0  &&
                                            (doctask.Any(t => t.to_username == user.UserName && t.stepid == x.stepid && t.ishandled != 1 && t.reimid == x.cw_djlc_djzb_id)//在task中任务存在(判断唯一提交任务的条件)
                                            )));

                return queryable;
            };
            return base.GetPageData(options);
        }

        public virtual PageGridData<cw_djlc_djzb> browseGetPageData(PageDataOptions options)
        {
            System.Linq.Expressions.Expression<Func<cw_djlc_djzb, bool>> orFilter = null;
            QueryRelativeList = (List<SearchParameters> parameters) =>
            {
                //方式1：动态生成or查询条件
                foreach (SearchParameters param in parameters)
                {
                    if (param.Name.Equals("is_enable") && param.Value.Equals("99"))
                    {
                        //注意:这里只需要判断or查询的字段，其他的字段不需要处理
                        //这里必须拷贝value值
                        if (orFilter == null && param.Name == "is_enable") { orFilter = x => false; }
                        //进行or模糊查询
                        orFilter = orFilter.Or(x => x.stepid == 99);
                        //清空原来的数据
                        param.Value = null;
                    }
                }
            };
            QueryRelativeExpression = (IQueryable<cw_djlc_djzb> queryable) =>
            {
                List<SearchParameters> parameters = options.Wheres.DeserializeObject<List<SearchParameters>>();
                foreach (SearchParameters param in parameters)
                {
                    if (param.Name.Equals("is_enable") && param.Value.Equals("99"))
                    {
                        queryable = queryable.Where(x =>
                                              (x.stepid == 99 && x.is_enable == 1 && x.is_delete == 0));
                    }
                    if (param.Name.Equals("is_enable") && param.Value.Equals("1"))
                    {
                        queryable = queryable.Where(x =>
                                              (x.stepid != 99 && x.is_enable == 1 && x.is_delete == 0));
                    }
                }
                queryable = queryable.Where(x => x.is_delete == 0);
                if (orFilter != null)
                {
                    queryable = queryable.Where(orFilter);
                }
                return queryable;
            };


            GetPageDataOnExecuted = (PageGridData<cw_djlc_djzb> grid) =>
            {
                //可对查询的结果的数据操作
                List<cw_djlc_djzb> sellOrders = grid.rows;
                foreach (cw_djlc_djzb djzb in sellOrders)
                {
                    if (djzb.stepid == 99)
                    {
                        djzb.is_enable = 99;
                    }
                }
            };
            return base.GetPageData(options);
        }

        public override WebResponseContent Update(SaveModel saveModel)
        {
             WebResponseContent webResponse = new WebResponseContent();
            UpdateOnExecuting = (cw_djlc_djzb cw_djlc_djzb, object addList, object updateList, List<object> delKeys) =>
            {
                    // 判断传入进来的对标物料及需求物料跟数据库中的物料是否一致
                    cw_djlc_djzb oldcw_djlc_djzb = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.cw_djlc_djzb_id == cw_djlc_djzb.cw_djlc_djzb_id).FirstOrDefault();

                    // 判断页面传入的对标物料号跟数据库中的对标物料号是否一致
                    if (oldcw_djlc_djzb.oldmaterialnum != cw_djlc_djzb.oldmaterialnum)
                    {
                        /// 判断传入对标物料编号是否有值
                        /// 1、如果有值，则需要通过对标编号判断是否被其他流程已经使用。
                        ///    1） 如果已经被其他流程使用，那么则不能将物料表中的BOM数据删除，
                        ///         a、传入的对标物料在其他流程中未使用到，那么该物料直接保存，将对标物料编号清空
                        ///         b、传入的对标物料在其他流程中使用到，那么则将其他流程中的物料编号赋值给对标物料编号。
                        ///    2） 如果没有被其他流程使用，那么则可以将物料表中的BOM数据删除。
                        /// 2、如果没有值，则该对标物料则可以直接保存到数据库中
                        cw_djlc_djzb cw_djlc_djzb1 = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.newmaterialnum == cw_djlc_djzb.oldmaterialnum && x.stepid != 99 && x.is_enable == 1 && x.is_delete == 0).FirstOrDefault();
                        if (!cw_djlc_djzb1.IsNullOrEmpty())
                        {
                            return webResponse.Error("对标物料号还未定价，请确认后，重新提交流程");
                        }
                        if (!oldcw_djlc_djzb.oldbomnumber.IsNullOrEmpty())
                        {
                            List<cw_djlc_djzb> cw_djlc_djzbList = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.oldbomnumber == oldcw_djlc_djzb.oldbomnumber || x.newbomnumber == oldcw_djlc_djzb.oldbomnumber && x.is_delete == 0).ToList();
                            if (cw_djlc_djzbList.Count() == 1)
                            {
                                // 如果其他流程未使用该物料编号，则根据该物料编号去物料表删除对应的BOM数据。
                                List<cw_djlc_wlzb> cw_djlc_wlzbList = DBServerProvider.DbContext.Set<cw_djlc_wlzb>().Where(x => x.bomnumber == oldcw_djlc_djzb.oldbomnumber && x.is_delete == 0).ToList();
                                DBServerProvider.DbContext.Remove(cw_djlc_wlzbList);
                                DBServerProvider.DbContext.SaveChanges();
                            }
                            // 需要将对标物料编号置空，在财务核准导入时，重新赋值
                            cw_djlc_djzb.oldbomnumber = "";
                            cw_djlc_djzb.is_have_bom = 0;
                        }
                        //判断修改后的对标物料是否已存在于系统中
                        cw_djlc_wlzb cw_djlc_wlzb = DBServerProvider.DbContext.Set<cw_djlc_wlzb>().Where(x => x.materialnum == cw_djlc_djzb.oldmaterialnum && x.is_delete == 0).FirstOrDefault();
                        if (!cw_djlc_wlzb.IsNullOrEmpty())
                        {
                            cw_djlc_djzb.is_have_bom = 1;
                            cw_djlc_djzb.oldbomnumber = cw_djlc_wlzb.bomnumber;
                        }
                    }
                    // 判断页面传入的需求物料号跟数据库中的需求物料号是否一致
                    if (oldcw_djlc_djzb.newmaterialnum != cw_djlc_djzb.newmaterialnum)
                    {
                        // 相同整车物料号在同一年内不能作为需求物料发起多笔。只能发起一笔。废弃流程除外
                        List<cw_djlc_djzb> cw_djlc_djzbList = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.newmaterialnum == cw_djlc_djzb.newmaterialnum && x.is_enable != 0 && x.is_delete != 1 && DateTime.Now.Year == x.CreateDate.Value.Year).ToList();
                        if (cw_djlc_djzbList.Count() > 0)
                        {
                            return webResponse.Error("同一整车物料号在同一年内不能作为需求物料发起多笔，请确认后，重新提交流程");
                        }

                        List<cw_djlc_wlzb> cw_djlc_wlzbList = DBServerProvider.DbContext.Set<cw_djlc_wlzb>().Where(x => x.bomnumber == oldcw_djlc_djzb.newbomnumber && x.is_delete == 0).ToList();
                        if (cw_djlc_wlzbList.Count() > 1)
                        {
                            DBServerProvider.DbContext.Remove(cw_djlc_wlzbList);
                            DBServerProvider.DbContext.SaveChanges();
                        }
                        cw_djlc_djzb.synchronizationbomstatus = 0;
                        cw_djlc_djzb.synchronizationpricestatus = 0;
                    }
                    Icw_djlc_djzbRepository repository =cw_djlc_djzbRepository.Instance;
                    repository.Update(cw_djlc_djzb, x => new { x.oldbomnumber, x.oldmaterialnum, x.newbomnumber, x.newmaterialnum,x.is_have_bom,
                                                               x.synchronizationbomstatus,x.synchronizationpricestatus,x.configuration_type,x.potential_clients,
                                                               x.sales_volume,x.expected_guide_price,x.share_development_expense,x.salechannel,x.new_product_upload,
                                                               x.development_expense_remark,x.remark,x.product_desc
                    },true);
                    DBServerProvider.DbContext.SaveChanges();
                    return webResponse.OK();
            };
            return base.Update(saveModel);
        }

        /// <summary>
        /// 定价主表删除：需求物料号需要物理删除
        /// 物料主表删除、物料价格维护表删除、配置表删除
        /// </summary>
        /// <param name="keys"></param>
        /// <param name="delList"></param>
        /// <returns></returns>
        public override WebResponseContent Del(object[] keys, bool delList = true)
        {
            WebResponseContent webResponse = new WebResponseContent();
            if (keys == null)
            {
                return webResponse.Error("参数不能为空！");
            }
            var dapper = DBServerProvider.SqlDapper;
            Guid cw_djlc_djzb_id = Guid.Parse(keys[0].ToString());
            try
            {
                dapper.BeginTrans();
                string sql = "update cw_djlc_djzb set is_delete = 1 where cw_djlc_djzb_id = @value";
                var data = dapper.ExcuteNonQuery(sql, new { value = cw_djlc_djzb_id });
                //删除当前产品定价流程的物料bom表
                sql = "delete from cw_djlc_wlzb where cw_djlc_djzb_id = @value";
                var data2 = dapper.ExcuteNonQuery(sql, new { value = cw_djlc_djzb_id });
                //删除传统配置表的内容
                sql = "update cw_djlc_configuration_tradition set del_flag = 1 where cw_djlc_djzb_id = @value";
                var data3 = dapper.ExcuteNonQuery(sql, new { value = cw_djlc_djzb_id });
                //删除新能源配置表的内容
                sql = "update cw_djlc_configuration_new_energy set del_flag = 1 where cw_djlc_djzb_id = @value";
                var data4 = dapper.ExcuteNonQuery(sql, new { value = cw_djlc_djzb_id });

                dapper.Commit();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                dapper.Rollback();
                return webResponse.Error("删除不成功，请重新再试！");
            }
            return webResponse.OK("删除成功！");
            /* 
            cw_djlc_djzb djzb = DBServerProvider.DbContext.Set<cw_djlc_djzb>().Where(x => x.cw_djlc_djzb_id == Guid.Parse(keys[0].ToString())).FirstOrDefault();
            djzb.is_delete = 1;// 删除标识：删除1   未删除0
            webResponse.Code = "-1";
            DBServerProvider.DbContext.Update(djzb);
            DBServerProvider.DbContext.SaveChanges();
            return webResponse.OK("删除成功！");*/

            //return base.Del(keys, delList);

        }

    }
}
